Skip to content

fix(openai): 支持 content 前缀思考标签折叠 - #94

Open
Lianye-Scythe wants to merge 1 commit into
Lianues:mainfrom
Lianye-Scythe:fix/openai-leading-think-tags
Open

fix(openai): 支持 content 前缀思考标签折叠#94
Lianye-Scythe wants to merge 1 commit into
Lianues:mainfrom
Lianye-Scythe:fix/openai-leading-think-tags

Conversation

@Lianye-Scythe

@Lianye-Scythe Lianye-Scythe commented Apr 28, 2026

Copy link
Copy Markdown

背景

部分 OpenAI-compatible API 中转服务不会把推理内容作为独立的 reasoning_content 字段返回,而是会将前缀思考块拼接到 message.content 的开头。

标准前缀格式示例:

<think>reasoning content</think>final answer

当前 Lim Code 对原生 reasoning_content 已有 thought: true 支持,但对这种被拼入 content 的前缀思考块只会按普通 Markdown 文本渲染,导致标签直接暴露,无法折叠为思考过程。

修复内容

1. 新增前缀思考标签解析器

新增:

  • backend/modules/channel/thinkTagParser.ts

实现流式安全的前缀思考块解析:

  • 只解析 assistant 内容开头的标准前缀思考块
  • 允许前置空白
  • 支持多个连续前缀思考块
  • 流式输出时会暂存半截标签,避免半截 opening / closing tag 暴露到 UI
  • 一旦普通正文开始,后续出现的同类标签会保留为普通文本

这样可以避免误伤 Markdown / 代码示例中的同类标签。

2. 接入流式响应累加器

修改:

  • backend/modules/channel/StreamAccumulator.ts

在普通文本进入 prompt tool parser 之前,先处理前缀思考块,并将其转换为:

{ text: '...', thought: true }

这样前端可以复用现有的思考内容折叠渲染逻辑。

3. 接入 OpenAI 非流式响应解析

修改:

  • backend/modules/channel/formatters/openai.ts

在非流式 OpenAI-compatible 响应中:

  • 保留原有 message.reasoning_content 解析逻辑
  • message.content 开头的标准前缀思考块进行拆分
  • 仅对非思考正文继续检测 XML / JSON prompt tool call

4. 补充测试

新增:

  • backend/__tests__/channel/thinkTagParser.test.ts

覆盖:

  • 标准前缀思考块
  • 前置空白
  • 多个连续前缀思考块
  • 流式半截标签不泄露
  • 普通正文中的同类标签不折叠
  • Markdown / 代码示例中的同类标签不折叠
  • OpenAI formatter 非流式解析
  • StreamAccumulator 流式解析

验证

已本地执行:

npm run compile

通过。

npm test -- backend/__tests__/channel/thinkTagParser.test.ts --runInBand

结果:

  • 1 个 test suite 通过
  • 12 个 tests 通过
npm --prefix frontend run build

通过。

影响范围

  • 仅影响模型响应内容解析阶段
  • 不修改前端思考块 UI
  • 不影响原生 reasoning_content 字段处理
  • 不自动迁移或修改历史消息

兼容性说明

本 PR 有意只处理标准前缀格式:

<think>...</think>answer

不会处理以下变体:

<thinking>...</thinking>
<think class="..."></think>

这是为了避免误判普通 Markdown / 代码示例。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant